menusectionbox: add support for "text-direction" attribute
authorChristian Hergert <chergert@redhat.com>
Wed, 12 Oct 2016 20:56:57 +0000 (13:56 -0700)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 13 Oct 2016 10:34:50 +0000 (06:34 -0400)
This allows the use of a "text-direction" hint set to one of "none", "rtl",
or "ltr" to enforce the text direction of a "horizontal-buttons"
display-hint.

This is useful when a menu has buttons that map to physical space in the
UI and therefore must match the application widgetry.

https://bugzilla.gnome.org/show_bug.cgi?id=772775

gtk/gtkapplicationwindow.c
gtk/gtkmenusectionbox.c
gtk/gtkmenutrackeritem.c
gtk/gtkmenutrackeritem.h

index 62d133a6f33913a00071656d3f61a3ed945b9fe8..2128f983c1bf8a3fb1d8bb7da341e7763553d6e7 100644 (file)
  * - "label": a user-visible string to use as section heading
  * - "display-hint": a string used to determine special formatting for the section.
  *     Possible values include "horizontal-buttons".
+ * - "text-direction": a string used to determine the #GtkTextDirection to use
+ *     when "display-hint" is set to "horizontal-buttons". Possible values
+ *     include "rtl", "ltr", and "none".
  *
  * The following attributes are used when constructing submenus:
  * - "label": a user-visible string to display
index 61c761b9675b358099e5d817beac8ac7b90e240b..b790825a64782a955cad0b674167fbec0ab72afa 100644 (file)
@@ -483,6 +483,7 @@ gtk_menu_section_box_new_section (GtkMenuTrackerItem *item,
   GtkMenuSectionBox *box;
   const gchar *label;
   const gchar *hint;
+  const gchar *text_direction;
 
   box = g_object_new (GTK_TYPE_MENU_SECTION_BOX, NULL);
   box->toplevel = parent->toplevel;
@@ -490,12 +491,25 @@ gtk_menu_section_box_new_section (GtkMenuTrackerItem *item,
 
   label = gtk_menu_tracker_item_get_label (item);
   hint = gtk_menu_tracker_item_get_display_hint (item);
+  text_direction = gtk_menu_tracker_item_get_text_direction (item);
 
   if (hint && g_str_equal (hint, "horizontal-buttons"))
     {
       gtk_orientable_set_orientation (GTK_ORIENTABLE (box->item_box), GTK_ORIENTATION_HORIZONTAL);
       gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (box->item_box)), GTK_STYLE_CLASS_LINKED);
       box->iconic = TRUE;
+
+      if (text_direction)
+        {
+          GtkTextDirection dir = GTK_TEXT_DIR_NONE;
+
+          if (g_str_equal (text_direction, "rtl"))
+            dir = GTK_TEXT_DIR_RTL;
+          else if (g_str_equal (text_direction, "ltr"))
+            dir = GTK_TEXT_DIR_LTR;
+
+          gtk_widget_set_direction (GTK_WIDGET (box->item_box), dir);
+        }
     }
 
   if (label != NULL)
index 7d8952185cf4f0e7ef5ab0330832474712f4cd2e..ef1b60cd9f34fc35163f8df9d15fd444dbf3b4c5 100644 (file)
@@ -726,6 +726,16 @@ gtk_menu_tracker_item_get_display_hint (GtkMenuTrackerItem *self)
   return display_hint;
 }
 
+const gchar *
+gtk_menu_tracker_item_get_text_direction (GtkMenuTrackerItem *self)
+{
+  const gchar *text_direction = NULL;
+
+  g_menu_item_get_attribute (self->item, "text-direction", "&s", &text_direction);
+
+  return text_direction;
+}
+
 GMenuModel *
 _gtk_menu_tracker_item_get_link (GtkMenuTrackerItem *self,
                                  const gchar        *link_name)
index 6b4fcb576a590bea2e8897c17c9462f5cd07c763..2f4f04a6fc4faf0a3dad055d230d98ee7b56c273 100644 (file)
@@ -53,6 +53,8 @@ const gchar *           gtk_menu_tracker_item_get_special               (GtkMenu
 
 const gchar *           gtk_menu_tracker_item_get_display_hint          (GtkMenuTrackerItem *self);
 
+const gchar *           gtk_menu_tracker_item_get_text_direction        (GtkMenuTrackerItem *self);
+
 GtkActionObservable *  _gtk_menu_tracker_item_get_observable            (GtkMenuTrackerItem *self);
 
 gboolean                gtk_menu_tracker_item_get_is_separator          (GtkMenuTrackerItem *self);